#ifndef RBTABLEHEADERVIEW_H_
#define RBTABLEHEADERVIEW_H_

#include <QHeaderView>
#include <QAbstractTableModel>
#include <QModelIndex>
#include <QHash>
#include <QPair>

/**
 * 自定义表头角色枚举，用于存储额外信息
 */
enum eRbHeaderRole
{
    COLUMN_SPAN_ROLE = Qt::UserRole + 1, // 跨列合并信息
    ROW_SPAN_ROLE,                       // 跨行合并信息
    COLUMN_SIZE_ROLE,                     // 列宽
    ROW_SIZE_ROLE                         // 行高
};

/**
 * 表头单元格对象
 * 负责维护多行多列表头的数据和层级关系
 */
class RbTableHeaderItem
{
public:
    RbTableHeaderItem(RbTableHeaderItem * parent = 0);              // 根节点构造函数
    RbTableHeaderItem(int arow, int acolumn, RbTableHeaderItem * parent = 0); // 指定行列构造
    ~RbTableHeaderItem();

    // 插入子节点
    RbTableHeaderItem * insertChild(int row, int col);

    // 获取子节点（const 与非 const 版本）
    const RbTableHeaderItem * child(int row, int col) const;
    RbTableHeaderItem * child(int row, int col);

    // 设置/获取角色数据
    void setData(const QVariant & data, int role);
    QVariant data(int role = Qt::UserRole + 1) const;

    // 获取行列索引
    inline int column() const { return column_prop; }
    inline int row() const { return row_prop; }

    // 获取父节点
    RbTableHeaderItem* parent() { return parent_item; }

    // 设置显示文本
    void setText(const QString & text);

    // 清空子节点和数据
    void clear();

private:
    int row_prop;  // 当前节点行号
    int column_prop; // 当前节点列号
    RbTableHeaderItem * parent_item; // 父节点
    QHash<QPair<int, int>, RbTableHeaderItem *> child_items; // 子节点集合，按行列存储
    QHash<int, QVariant> role_datas; // 存储每个 role 对应的数据；；只是这一个item的;一个item有好几种角色。
                                    //不同角色有不同的数据内容
};


/**
 * 表头模型
 * 用于存储表头的多行多列信息，可配合 QHeaderView 实现复杂表头绘制
 */
class RbTableHeaderModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    RbTableHeaderModel(int rows, int cols, QObject * parent = 0); // 构造函数，指定行列数
    virtual ~RbTableHeaderModel();

public:
    // 重写 QAbstractTableModel 的接口
    virtual QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
    virtual int rowCount(const QModelIndex & parent = QModelIndex()) const { Q_UNUSED(parent); return row_count_prop; }
    virtual int columnCount(const QModelIndex & parent = QModelIndex()) const { Q_UNUSED(parent); return column_count_prop; }
    virtual QVariant data(const QModelIndex &index, int role) const;
    virtual bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
    virtual Qt::ItemFlags flags(const QModelIndex &index) const;

    void rebuildHeaderStructure();


    void setHeaderRowCount(int rows);
    void setHeaderColumnCount(int cols);

private:
    int row_count_prop; // 总行数
    int column_count_prop; // 总列数
    RbTableHeaderItem* root_item; // 根节点，所有表头单元格的父节点
};


/**
 * 自定义表头视图
 * 支持跨行跨列、多行多列表头显示和交互
 */
class RbTableHeaderView : public QHeaderView
{
    Q_OBJECT
public:
    RbTableHeaderView(Qt::Orientation orientation, int rows, int columns, QWidget* parent = 0); // 构造函数
    RbTableHeaderView(Qt::Orientation orientation, QWidget* parent = 0);
    virtual ~RbTableHeaderView();

    // 设置单元格尺寸
    void setRowHeight(int row, int rowHeight);
    void setColumnWidth(int col, int colWidth);

    //设置行列的大小
    void setRowNumber(int rows);
    void setColumnNumber(int columns);
    void setRowAndColumn(int rows, int columns);

    // 设置跨行跨列
    void setSpan(int row, int column, int rowSpanCount, int columnSpanCount);

    // 设置单元格背景/前景色
    void setCellBackgroundColor(const QModelIndex & index, const QColor &);
    void setCellForegroundColor(const QModelIndex & index, const QColor &);
protected:
    // 重写 QHeaderView 的事件和绘制方法
    // virtual void mousePressEvent(QMouseEvent * event); // 鼠标按下事件
    // virtual QModelIndex indexAt(const QPoint &);        // 根据坐标获取索引
    virtual void paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const; // 绘制表头
    virtual QSize sectionSizeFromContents(int logicalIndex) const; // 根据内容计算尺寸

    // 额外的辅助方法
    QModelIndex columnSpanIndex(const QModelIndex & currentIndex) const; // 获取列合并起点
    QModelIndex rowSpanIndex(const QModelIndex & currentIndex) const;    // 获取行合并起点
    int columnSpanSize(int row, int from, int spanCount) const;           // 获取跨列宽度
    int rowSpanSize(int column, int from, int spanCount) const;           // 获取跨行高度
    int getSectionRange(QModelIndex & index, int * beginSection, int * endSection) const; // 获取单元格范围

protected Q_SLOTS:
    void onSectionResized(int logicalIdx, int oldSize, int newSize); // 处理列/行尺寸变化

Q_SIGNALS:
    void sectionPressed(int from, int to); // 发射选择的区域范围

private:
    RbTableHeaderModel* headerModel;
    int m_rows;
    int m_columns;
private:
    RbTableHeaderModel* headerModel;
};

#endif /* RBTABLEHEADERVIEW_H_ */
